import { getToken } from '@/utils/auth'

/**
 * SSE请求工具类
 * @param {string} url 请求地址
 * @param {object} data 请求数据
 * @param {function} onMessage 消息回调
 * @param {function} onError 错误回调
 * @param {AbortSignal} signal 中止信号
 * @param {function} onComplete 完成回调
 */
export function sseRequest(url, data, onMessage, onError, signal, onComplete) {
  // 创建一个新的 AbortController 如果没有提供 signal
  const controller = signal ? null : new AbortController();
  const abortSignal = signal || controller?.signal;

  // 构建完整的URL
  const baseURL = process.env.VUE_APP_BASE_API;
  const fullUrl = baseURL + url;

  fetch(fullUrl, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + getToken(),
      'Accept': 'text/event-stream',
    },
    body: JSON.stringify(data),
    signal: abortSignal
  })
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    // 获取 reader 用于读取流数据
    const reader = response.body.getReader();
    const decoder = new TextDecoder();
    let buffer = '';

    // 读取数据流
    function readStream() {
      reader.read().then(({done, value}) => {
        if (done) {
          console.log('Stream complete');
          onComplete && onComplete();
          return;
        }

        // 解码并处理数据
        const text = decoder.decode(value);
        buffer += text;

        // 按行分割并处理每一行
        const lines = buffer.split('\n');
        buffer = lines.pop() || ''; // 保留最后一个不完整的行

        for (const line of lines) {
          if (line.trim() === '') continue;
          if (line.startsWith('data:')) {
            try {
              const data = JSON.parse(line.slice(5).trim());
              onMessage && onMessage(data);
            } catch (err) {
              console.error('SSE parse error:', err);
            }
          }
        }

        // 继续读取
        readStream();
      }).catch(error => {
        if (error.name === 'AbortError') {
          console.log('Fetch aborted');
          onComplete && onComplete('aborted');
        } else {
          console.error('Stream error:', error);
          onError && onError(error);
        }
      });
    }

    readStream();
  })
  .catch(error => {
    if (error.name === 'AbortError') {
      console.log('Fetch aborted');
      onComplete && onComplete('aborted');
    } else {
      console.error('Fetch error:', error);
      onError && onError(error);
    }
  });

  // 返回控制对象
  return {
    close: () => {
      if (controller) {
        controller.abort();
      }
    }
  };
}
